package methods

import "fmt"

type Point struct{ x, y int }
type Path []Point

// 给Path数据定义方法，可以直接调用 Path.Bebigger
func (a Path) Bebigger() int {
	total := 0
	for i := 0; i < len(a); i++ {
		total += a[i].x + a[i].y
	}
	return total
}

// 以指针作为接收者的方法
// 注意这里的接收者不能本身就是指针，相当于 var p *int =》 func （p） set（x){}   这样是不被允许的
func (p *Point) Setx(x, y int) int {
	p.x = x
	p.y = y
	return p.x
}

func UseMethods() {
	p := &Point{3, 4}
	p.Setx(4, 5)
	fmt.Println(*p)
	//===================
	q := Point{3, 5}
	fmt.Println(q)
	(&q).Setx(6, 6) //注意，这个（）是必须的
	fmt.Println(q)
	q.Setx(7, 7) //虽然接收者是*Point，但是这样仍然可以使用，实质上是对p和&p的隐形转换
	fmt.Println(q)

	//与此同时，nil也可以作为合法接收者。若接收者为string等，那么nil可以算是特殊的string的话，nil就可以调用string的所有函数。
}
